﻿/* File Created: августа 30, 2012 */
function UIManager() {
    /// <summary>
    /// Класс для работы с интерфейсом
    /// </summary>

    var $this = this;

    var templatesSourcePath = "Templates/";
    var templatesExtension = ".htm";

    $this.templates = new Templates();
    if ($this.templates == null) {
        log.error("UIManager init error: templates are null");
    }

    $this.firstPage = $("#page1");
    $this.secondPage = $("#page2");
    if ($this.firstPage == null || $this.secondPage == null) {
        log.error("UIManager init error: there are no #page1 or #page2 on the page");
    }

    $this.pageToChange = null;

    $this.loadModelTemplate = function (templateName, callback) {
        /// <summary>
        /// Загружает шаблон
        /// </summary>
        /// <param templateName="templateName">Имя шаблона</param>
        /// <param callback="callback">Функция, вызываемая после загрузки шаблона</param>

        if (!callback) {
            log.error("UIManager error: callback function is not defined");
            return;
        }

        if ($this.firstPage == null || $this.secondPage == null) {
            log.error("UIManager error: there are no #page1 or #page2 on the page");
            return;
        }

        $.mobile.loading("show", {
            text: "Загрузка страницы...",
            textVisible: true,
            theme: "a"
        });

        if ($this.pageToChange == null) {
            $this.pageToChange = $this.firstPage;
        }
        else {
            if (!$.mobile.activePage[0].id || !$this.firstPage[0].id) {
                log.error("UIManager error: pages ids are empty");
                return;
            }
            $this.pageToChange = $.mobile.activePage[0].id == $this.firstPage[0].id ? $this.secondPage : $this.firstPage;
        }

        // Get the header for the page.
        var $header = $this.pageToChange.children(":jqmData(role=header)");
        // Get the content area element for the page.
        var $content = $this.pageToChange.children(":jqmData(role=content)");
        // Get the footer area element for the page.
        var $footer = $this.pageToChange.children(":jqmData(role=footer)");

        if (!$this.templates.headers[templateName] || !$this.templates.contents[templateName] || !$this.templates.footers[templateName]) {
            $.get(templatesSourcePath + templateName + templatesExtension, function (data) {
                if (!data) {
                    log.error("UIManager load external template error: data is null");
                    $.mobile.loading("hide");
                    return;
                }

                var headerString = $(data).find('[data-role="header"]').html();
                var contentString = $(data).find('[data-role="content"]').html();
                var footerString = $(data).find('[data-role="footer"]').html();

                if (!headerString || !contentString || !footerString) {
                    log.error("UIManager load external template error: templates are null");
                    $.mobile.loading("hide");
                    return;
                }

                $this.templates.headers[templateName] = headerString;
                $this.templates.contents[templateName] = contentString;
                $this.templates.footers[templateName] = footerString;

                $header.html(headerString);
                $content.html(contentString);
                $footer.html(footerString);

                callback();
            });
        }
        else {
            $header.html($this.templates.headers[templateName]);
            $content.html($this.templates.contents[templateName]);
            $footer.html($this.templates.footers[templateName]);

            callback();
        }
    }

    $this.refreshUI = function () {
        /// <summary>
        /// Модифицируeт следующую страницу под jQm
        /// </summary>

        $this.changePage();

        if ($.mobile.activePage) {
            $.mobile.activePage.trigger('create');
        }

        $.mobile.loading("hide");
    }

    $this.changePage = function () {
        /// <summary>
        /// Производит jQm переход на следующую страницу 
        /// </summary>

        if ($this.pageToChange == null) {
            log.error("UIManager error: pageToChange is null");
            return;
        }

        $.mobile.changePage('#' + $this.pageToChange[0].id, { transition: 'slide' });
    }

    $this.applyBindings = function (viewModel) {
        /// <summary>
        /// Производит привязки элементов с аттрибутом data-bind (необходимо персонально указывать элементы при наличии нескольких моделей)
        /// </summary>
        /// <param name="viewModel">Модель для привязки</param>

        if ($this.pageToChange == null) {
            log.error("UIManager error: pageToChange is null");
            return;
        }

        try {
            ko.applyBindings(viewModel, $this.pageToChange[0]);
        } catch (e) {
            $.mobile.loading("hide");
            log.error(e);
        }
    }
}